import express from 'express';
import cors from 'cors';
import helmet from 'helmet';
import rateLimit from 'express-rate-limit';
import morgan from 'morgan';
import dotenv from 'dotenv';

// 导入数据库配置和模型
import { testConnection } from './config/database.js';
import { syncDatabase } from './models/index.js';

// 导入路由
import transactionRoutes from './routes/transactions.js';
import categoryRoutes from './routes/categories.js';
import statisticsRoutes from './routes/statistics.js';

// 加载环境变量
dotenv.config();

const app = express();
const PORT = process.env.PORT || 3000;

// 安全中间件
app.use(helmet());

// 请求日志
app.use(morgan('combined'));

// 跨域设置 - 允许所有来源（开发环境）
app.use(cors({
  origin: '*',
  credentials: false,
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));

// 限流设置
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 100, // 限制每个IP 15分钟内最多100个请求
  message: '请求过于频繁，请稍后再试'
});
app.use(limiter);

// 解析JSON
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true }));

// 提供静态文件（测试页面）
app.use(express.static('public'));

// 初始化数据库
const initDatabase = async () => {
  try {
    await testConnection();
    await syncDatabase();
  } catch (error) {
    console.error('❌ 数据库初始化失败:', error);
    process.exit(1);
  }
};

// 路由
app.use('/api/transactions', transactionRoutes);
app.use('/api/categories', categoryRoutes);
app.use('/api/statistics', statisticsRoutes);

// 健康检查端点
app.get('/health', (req, res) => {
  res.status(200).json({
    status: 'success',
    message: '记账本API服务运行正常',
    timestamp: new Date().toISOString()
  });
});

// 404处理
app.use('*', (req, res) => {
  res.status(404).json({
    status: 'error',
    message: '接口不存在'
  });
});

// 全局错误处理
app.use((error, req, res, next) => {
  console.error('服务器错误:', error);
  res.status(500).json({
    status: 'error',
    message: process.env.NODE_ENV === 'production' ? '服务器内部错误' : error.message
  });
});

// 启动服务器
const startServer = async () => {
  await initDatabase();
  
  app.listen(PORT, '0.0.0.0', () => {
    console.log(`🚀 记账本API服务已启动`);
    console.log(`📍 本地地址: http://localhost:${PORT}`);
    console.log(`🌐 局域网地址: http://192.168.1.6:${PORT}`);
    console.log(`🌍 环境: ${process.env.NODE_ENV || 'development'}`);
    console.log(`💾 数据库: SQLite`);
  });
};

startServer().catch(error => {
  console.error('❌ 服务启动失败:', error);
  process.exit(1);
});

export default app;